<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Generator</title>
</head>
<body>
<script type="text/javascript">
    // let obj = {
    //     data: [100, 200, 300],
    //     [Symbol.iterator]() {
    //         let i = 0;
    //         let that = this;
    //         return {
    //             next() {
    //                 if (i < that.data.length) {
    //                     return {done: false, value: that.data[i++]};
    //                 } else {
    //                     return {done: true};
    //                 }
    //             },
    //             return() {
    //                 console.log("call return");
    //                 return {done: true};
    //             },
    //             throw() {
    //             }
    //         }
    //     }
    // };
    //
    // let it = obj[Symbol.iterator]();

    // console.log(it.next());
    // console.log(it.next());
    // console.log(it.next());
    // console.log(it.next());


    // function* gen() {
    //     yield 10;
    //     yield 20;
    //     yield 30;
    //     return;
    // }

    // let g01 = gen();
    // console.log(g01.next());
    // console.log(g01.next());
    // console.log(g01.next());
    // console.log(g01.next());

    // let obj = {
    //     [Symbol.iterator]() {
    //         return gen();
    //     }
    // };
    //
    // console.log([...obj]);

    // function* gen() {
    //     try {
    //         while (true) {
    //             let ret = yield Math.random();
    //
    //             if (ret == 1) {
    //                 break;
    //             }
    //         }
    //     } catch (e) {
    //         console.log(e);
    //     }
    // }
    //
    // let g02 = gen();
    // console.log(g02.next());
    // // g02.return();
    // g02.throw("abc");
    // console.log(g02.next());
    // // console.log(g02.next(1));
    // // console.log(g02.next());

    // function* gen01() {
    //     yield 10;
    //     yield 20;
    //     yield 30;
    //     return;
    // }
    //
    // let arr = ['a', 'b', 'c'];
    //
    // function* gen02() {
    //     yield "aa";
    //     // yield* gen01();
    //     yield* arr[Symbol.iterator]();
    //     // yield 10;
    //     // yield 20;
    //     // yield 30;
    //     yield "cc";
    //     return;
    // }

    // let g02 = gen02();
    // console.log(g02.next());
    // console.log(g02.next());
    // console.log(g02.next());
    // console.log(g02.next());
    // console.log(g02.next());
    // console.log(g02.next());

    function* gen03() {
        yield this.name;
        yield this.age;
        return;
    }

    let g03 = gen03.call({
        name: "zhangsan",
        age: 18
    });

    console.log(g03.next());
    console.log(g03.next());
    console.log(g03.next());


</script>
</body>
</html>